import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable, tap } from 'rxjs';
import { AppService } from './app.service';

@Injectable()
export class AaaInterceptor implements NestInterceptor {

  constructor(private appService : AppService){}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log(this.appService.getHello());

    const now = Date.now();
    /* 
      当我们使用 next.handle() 方法调用请求管道中的下一个处理程序。
      返回Observable对象(执行结果)，会传递给pipe()函数，做进一步处理。
      
      可以使用 pipe 方法来对这个 Observable 对象 添加操作符。
      map操作符 用于对 observable 中的每个元素进行转换，返回一个新的 observable，
      tap操作符 允许我们在 Observable 对象的流中添加一个副作用操作，而不会改变流的内容。


      在 NestJS 中，这些方法通常用于拦截器、中间件和其他请求管道组件中，
      以对请求进行处理、转换和监视 
    */
    return next.handle().pipe(
      tap(()=> console.log(`After... ${Date.now() - now}ms`))
    );


  }

}
